package demo.Thread;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/8/10-08-10-9:21
 * @Description：demo.Thread   线程状态
 */
/*
 new
    线程刚被创建
runnable
    可运行， 调用了start方法后线程由new变成runnable
blocked
    锁阻塞，线程A和线程B都要执行方法test，而且方法test被加了锁，线程A先拿到锁去执行test方法
    线程B这时候需要等待线程A把锁释放，这时的B就在blocker状态           synchronized(锁对象) 线程进入同步代码快后，其他线程从runnable -> blocked 当线程释放锁后  其他线程从blocked -> runnable
waiting
    无限期等待，一个线程在等待另一个线程执行一个（唤醒）动作时，该线程进入Waiting状态          join()使线程从runnable - > waiting  t1.join()  t1线程加入, t2线程进入无限等待，直到t1执行完再执行
    进入这个状态是不能自动唤醒的，必须等待另一个线程调用notify或者notifyAll方法才能够唤醒
Timed_waiting
    有限期等待，和waiting状态类似，但是有一个时间期限，时间到了，自己也会自动醒来    Thread.sleep()线程状态从runnable->timed_waiting 当前线程休眠指定时间再恢复到runnable状态
terminated
    终止死亡，run方法执行结束的线程处于这种状态，
    ！！！死亡后的线程不能再次启动，否则线程状态非法异常
 */
    /*
    t1.join(毫秒值)， 则t2等待毫秒值，若t1还未执行，则t2继续执行       t2线程 runnable -> timed_waiting
    join()使进程从runnable - > waiting  t1.join()  t1线程加入, t2线程进入无限等待，直到t1执行完再执行

    interrupt() 打破阻塞状态，并抛出异常，打断sleep(),从timed_waiting -> runnable     打断join() 从waiting -> runnable     打断join(毫秒值)， 从timed_waiting -> runnable
    isInterrupted() 的值默认是false，当打断后改为true，在抛出异常后，改回为false   不会清除标记
    interrupted() 返回标识值    interrupt第一次返回true 其余返回false，         会清除标记

     */
public class thread_state {
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread1: thread_state.run");
            }
        };
//        System.out.println(thread.getState());    //NEW
//        thread.start();
//        for (int i = 0; i < 100; i++) {
//            System.out.println(thread.getState());     //RUNNABLE -> TIMED_WAITING -> RUNNABLE -> BLOCKED -> TERMINATED
//            BLOCKED main线程和thread1线程同时调用println打印 println方法中有同步代码块，所以造成了blocked锁阻塞
//        }
        Thread thread2 = new Thread(){
            @Override
            public void run() {
                try {
                    thread1.join();                  //thread2进入等待，thread1加入
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread2: thread_state.run");
            }
        };
        thread2.start();
        thread1.start();
        thread1.interrupt();         //打断sleep()，和join()方法
        thread2.interrupt();
        for (int i = 0; i < 10; i++) {
            Thread.sleep(1);
            System.out.println( "thread1: " + thread1.getState() + ",  thread2: " + thread2.getState());
        }
    }
}
